概述
GLSurfaceView 继承自 SurfaceView,并且实现了 SurfaceHolder.Callback2 接口。在 SurfaceView 的基础上添加了 EGL 的管理,并自带了一个GLThread绘制线程。
这使得 GLSurfaceView 也拥有了 OpenGlES 所提供的图形处理能力,通过它定义的 Render 接口,使更改具体的 Render 的行为非常灵活性,只需要将实现了渲染函数的 Renderer 的实现类设置给 GLSurfaceView 即可。
GLSurfaceView 涉及到了OpenGL ES,使用 GLSurfaceView 必须开启硬件加速属性。
本文我们只简单介绍 GLSurfaceView 的使用,相关 OpenGL ES 2.0的使用后面会有专门的文章来介绍。
GLSurfaceView 的特性
- 管理一个surface,这个surface就是一块特殊的内存,能直接排版到android的视图view上。
- 管理一个EGL display,它能让opengl把内容渲染到上述的surface上。
- 用户自定义渲染器(render)。
- 让渲染器在独立的线程里运作,和UI线程分离。
- 支持按需渲染(on-demand)和连续渲染(continuous)。
- 可以封装、跟踪并且排查渲染器的问题。
GLSurfaceView 的方法
- setRenderMode(Renderer renderer):设置渲染模式。RENDERMODE_CONTINUOUSLY(每一帧都会触发渲染)和RENDERMODE_WHEN_DIRTY(需要时渲染,在创建和调用requestRender()时)
- setEGLConfigChooser:设置配置选择器,进行颜色,深度,模板等等设置,在setRenderer之前调用
- setEGLWindowSurfaceFactory:自定义EGLSurface工厂
- setEGLContextClientVersion:设置 opengl es 版本
- setRenderer(Renderer renderer):设置渲染器。
Renderer 接口
看一下渲染器接口定义的方法:
- onSurfaceCreated(GL10 gl, EGLConfig config):当 Surface 被创建的时候,GLSurfaceView 会调用这个方法;在应用程序第一次调用时会调用,当设备被唤醒或者用户从其他 Activity 切换回来时,也可能会被调用。
- onSurfaceChanged(GL10 gl, int width, int height):在 Surface 被创建以后,每次 Surface 尺寸变化时,这个方法都会被 GLSurfaceView 调用到。
- onDrawFrame(GL10 gl):当绘制一帧时,这个方法会被调用。在这个方法返回后,渲染缓冲区会被交换并显示在屏幕上。
为什么上面的方法都有个 GL01 呢?它是 OpenGL ES 1.0 的API遗留下来的,如果要编写使用 OpenGL ES 1.0 的渲染器,就要使用这个参数。但是,对于 OpenGL ES 2.0 来说,GLES20类提供了静态方法来存取。
GLSurfaceView 的使用
下面介绍 GLSurfaceView 的基本使用,使用 GLSurfaceView 可以在 Android 中搭建一个基本的 OpenGL ES 开发环境。
下面的代码使用 OpengGL ES 2.0 的 API 绘制了一个三角形。
1 | public class MyGLSurfaceView extends GLSurfaceView implements GLSurfaceView.Renderer { |